Build123d: 作ったPartやSketchに対する相対位置の指定
良い方法を模索したいinajob.icon
大きな四角に接するように小さな四角を配置したいとき
https://scrapbox.io/files/64601a857fb3cb001b6427d1.png
こういうやつ
4隅の頂点を取得する方法
code:python
from build123d import *
from ocp_vscode import show_object # ocp_vscodeで実行するときはこれが必要
def anchor(s, axis1=Axis.X, axis2=Axis.Y, aligns=(Align.MIN, Align.MIN)):
v1 = s.vertices().sort_by(axis1, False).sort_by(axis2, False)0.to_vector() v2 = s.vertices().sort_by(axis1, False).sort_by(axis2, True)0.to_vector() v3 = s.vertices().sort_by(axis1, True).sort_by(axis2, False)0.to_vector() v4 = s.vertices().sort_by(axis1, True).sort_by(axis2, True)0.to_vector() return v1
elif aligns1 ==Align.MAX: return v2
elif aligns1 == Align.CENTER: return (v1+v2)/2
elif aligns0 == Align.MAX: return v3
elif aligns1 == Align.MAX: return v4
elif aligns1 == Align.CENTER: return (v3+v4)/2
elif aligns0 == Align.CENTER: return (v1+v3)/2
elif aligns1 == Align.MAX: return (v2+v4)/2
with BuildPart() as part:
with BuildSketch():
s = Rectangle(10,10, align=(Align.MIN, Align.MIN))
with Locations(anchor(s, aligns=(Align.MAX, Align.CENTER))):
Rectangle(2,2, align=(Align.CENTER, Align.CENTER))
extrude(amount=2)
show_object(part)
いまのBuildSketchの平面を取得する方法があればaxis1, axis2は指定不要に出来そう
bounding_boxを使う方法
code:python
from build123d import *
from ocp_vscode import show_object # ocp_vscodeで実行するときはこれが必要
with BuildPart() as part:
with BuildSketch():
s = Rectangle(10,10, align=(Align.MIN, Align.CENTER))
with Locations((s.bounding_box().size.to_tuple()0,0,0)): Rectangle(2,2, align=(Align.MIN, Align.CENTER))
extrude(amount=2)
show_object(part)
alignをデフォルトのCENTER,CENTER以外にすることが多い
実寸合わせする際に対象物の中点ではなく角を使うことが多いため
参照元としたいRectangleのbounding_boxを取得し、そのX方向サイズだけLocationsでずらした位置に次の図形を作る
別解としては大きなRectangleのサイズを変数にすれば、その変数を使って小さな四角を配置できるので、それでも良い
(s.bounding_box().size.to_tuple()[0],0,0) を関数にくくりだすと読みやすくなりそう
XY軸正負対応版
Rectangleのすべての角、辺の中点を計算できるanchor関数を書いてみた
元図形のAlignによらない
Build123dの作法がわかっていないので、流用できる関数や、もしかしたらすでに同機能の関数があるかも・・?
BOSL2はこれがあらゆるプリミティブ図形に定義されていたはず 角の頂点を指定するのはフィルタでやるのが良さそう
中点も2つの角の中心にした方が良さそう
後で書き直す
code: python
from build123d import *
from ocp_vscode import show_object # ocp_vscodeで実行するときはこれが必要
def anchor(s, axis, a):
t = s.bounding_box().size.to_tuple()
sa = s.align
yoffset = 0
if axis == "+X":
xoffset = 0
elif axis == "-X":
elif axis == "+Y":
yoffset = 0
elif axis == "-Y":
xoffset = xoffset + 0
elif sa0 == Align.CENTER: yoffset = 0
elif sa1 == Align.CENTER: ret = None
if a == Align.MIN:
ret = (t0 + xoffset,0 + yoffset) elif a == Align.MAX:
ret = (t0 + xoffset,t1 + yoffset) elif a == Align.CENTER:
ret = (t0 + xoffset,t1/2,0 + yoffset) print(axis)
return ret
return None
with BuildPart() as part:
with BuildSketch():
s = Rectangle(10,10, align=(Align.MIN, Align.MIN))
with Locations(anchor(s, "+Y", Align.CENTER)):
Rectangle(2,2, align=(Align.CENTER, Align.CENTER))
extrude(amount=2)
show_object(part)